/**
 * @Author yang
 * @Description //TODO
 * @Date 2021/5/27
 * @Time 12:42
 **/
package datastructure

import "fmt"

type loopqueue struct {
	size  int
	front int
	rear  int
	queue []int
}

func NewLoopQueue(size int) *loopqueue {
	return &loopqueue{
		size:  size,
		front: 0, // 第一个元素的下标
		rear:  0, // 插入元素的位置下标
		queue: make([]int, size),
	}
}

func (queue *loopqueue) empty() bool {
	return queue.front == queue.rear
}

func (queue *loopqueue) full() bool {
	return (queue.rear+1)%queue.size == queue.front
}

func (queue *loopqueue) add(num int) {
	if queue.full() {
		panic("full")
	}
	queue.queue[queue.rear] = num
	queue.rear = (queue.rear + 1) % queue.size
	return
}

func (queue *loopqueue) get(num int) int {
	if queue.empty() {
		panic("empty")
	}
	data := queue.queue[queue.front]
	queue.front = (queue.front + 1) % queue.size
	return data
}

func (queue *loopqueue) show() {
	if queue.empty() {
		panic("empty")
	}
	// 高内聚， 低耦合
	size := (queue.rear + queue.size - queue.front) % queue.size
	for i := queue.front; i < queue.front+size; i++ {
		fmt.Println("=====> ", queue.queue[i])
	}
}

func (queue *loopqueue) peek() int {
	if queue.empty() {
		panic("empty")
	}
	// 高内聚， 低耦合
	return queue.queue[queue.front]
}
